Dispatcher={};
local msgHandleDic = {}; --KEY是消息名，值是字典，放函数

function Dispatcher:addMessageListener(type, handler,params)
	if type == nil then
		Utils.log("事件监听错误，type为空");
	end
	local handlers = msgHandleDic[type];
	if handlers == nil then
		handlers = {};
		msgHandleDic[type] = handlers
	end
	--禁止重复添加相同事件相同处理
	if handlers[handler] ~= nil then
		return;
	end
	handlers[handler] = {handler,params};
end

function Dispatcher:removeMessageListener(type, handler)
	if handler == nil then 
		Utils.log("removeMessageListener",type,"handler==nil");
		return;	
	end
	local handlers = msgHandleDic[type];
	if handlers == nil then 
		return 
	end;
	handlers[handler] = nil;
end

function Dispatcher:removeAllMessageListener(type)
	msgHandleDic[type] = nil;
end

--[[
	定死事件的参数而不是用可变参数的原因有以下：
	1. 使用可变参数的话，则回调无法直接使用...，会报错（cannot use '...' outside a vararg function near '...'），解决方案其中有将可变参数使用{}包起来，然后在回调调用处使用unpack进行解包；参数展开则没有这些问题；
	2. 展开的缺点就是会导致参数不能超过展开的数量，但是对于事件的调用，应该是不会存在传入5个参数那么多的情况出现，比可变参数少了封包以及解包的过程
]]
function Dispatcher:dispatch(type, args1,args2,args3,args4,args5)
	local handlers = msgHandleDic[type];
	if handlers ~= nil then
		local fun = nil;
		local funArgs = nil;
		for _,handleData in pairs(handlers) do
			fun = handleData[1];
			funArgs = handleData[2];
			if funArgs == nil then
				fun( args1,args2,args3,args4,args5 );
			else
				fun(funArgs,args1,args2,args3,args4,args5);
			end
		end
	end
end